#pragma once
// #define _GNU_SOURCE
#include <sys/uio.h> // readv、writev
#include <iostream>
using namespace std;

// 内存块的分区: [ 已读内存 | 已写内存(未读) | 可写内存 ]
//                   _readPos      _writePos

class Buffer { // 用于网络数据通信的缓冲区
public:
	Buffer(int size); // 实例化Buffer
	~Buffer();        // 销毁Buffer

	bool extendRoom(ssize_t size); // 使Buffer具有size大小的空间
	int writeableSize() { return _capacity - _writePos; } // 得到可写空间的大小
	int readableSize() { return _writePos - _readPos; }   // 得到可读空间的大小

	// 写内存: (1)直接写、(2)读取套接字的数据
	int appendString(const char* data, int size); // 直接写入size大小的数据
	int appendString(const char* data);           // 直接写入数据
	int appendString(const string data);          // 直接写入数据

	int appendHead(const int length);     // 添加数据头。网络数据 = 数据头 + 有效载荷 -> 解决粘包问题
	int appendPackage(const string data); // 添加网络数据。网络数据 = 数据头 + 有效载荷

	int readSockfd(int sockfd); // 读取套接字的数据

	char* findCRLF();		    // 根据\r\n取出一行，找到其在数据块中的位置，返回该位置

	int sendData(int sockfd);   // 发送数据

	char* data() { return _data + _readPos; } // 得到可读数据的起始位置

	// 根据参数读取出指定字节数的数据
	string data(int length) {
		string msg = string(_data + _readPos, length);
		_readPos += length;
		return msg;
	}

	int readPosIncrease(int count) { // 移动读取位置
		_readPos += count;
		return _readPos;
	}
private:
	char* _data;   // 指向[用于存储数据的内存块]
	int _capacity; // 内存块的容量
	ssize_t _readPos;  // 当前的读取位置
	ssize_t _writePos; // 当前的写入位置
};